#pragma once
#include <iostream>
#include <string>
#include <cstdio>
#include <cstdarg>
using namespace std;

// 日志是由日志级别的
#define DEBUG   0
#define NORMAL  1
#define WARNING 2
#define ERROR   3 // 错误，但不影响执行
#define FATAL   4 // 致命的

const char* gLevelMap[] = {
    "DEBUG",
    "NORMAL",
    "WARNING",
    "ERROR",
    "FATAL"
};

#define LOGFILE "./threadpool.log"

// 完整的日志功能，至少：日志等级 时间 支持用户自定义(日志内容)
void logMessage(int level, const char* format, .../*可变参数*/)
{
#ifndef DEBUG_SHOW
    if(level == DEBUG) return;
#endif
    // va_list ap;
    // va_start(ap, format); // format初始化ap
    // while()
    // int x = va_arg(ap, int);
    // va_end(ap);
    char stdBuffer[1024]; // 标准部分
    time_t timestamp = time(nullptr);
    // struct tm *localtime = localtime(&timestamp);
    snprintf(stdBuffer, sizeof(stdBuffer), "[%s][%ld]", gLevelMap[level], timestamp);

    char logBuffer[1024]; // 自定义部分
    va_list args;
    va_start(args, format);
    // vprintf(format, args);
    vsnprintf(logBuffer, sizeof logBuffer, format, args);
    va_end(args);

    FILE* fp = fopen(LOGFILE, "a");

    // printf("%s %s\n", stdBuffer, logBuffer); // 向显示屏上打
    fprintf(fp, "%s %s\n", stdBuffer, logBuffer);

    fclose(fp);
}
